#include <iostream>
#include <vector>
#include <queue>
using namespace std;
  struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
 

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
    // 使用一个队列存储树的节点，通过记录当前层的节点数量实现按层划分节点值。
    // 具体来说，先将根节点入队；之后循环处理队列，每次先获取当前队列的大小（levelsize）—— 这个大小就是当前层的节点总数
    // 接着创建临时向量v用于存储当前层的节点值，通过for循环遍历levelsize次（确保处理完当前层所有节点）
    // 每次取出队头节点，将其值存入v，再弹出节点并将其左右孩子入队（这些孩子会作为下一层的节点）
    // 当前层处理完毕后，将v存入二维向量vv；重复此过程直到队列为空，最终vv中就存储了按层序排列的节点值
    vector<vector<int>> vv;
    if(root==nullptr)
        return vv;
    vector<vector<int>> retarr;
    queue<TreeNode*> q;
    q.push(root);
    while(!q.empty())
    {
        int levelsize = q.size(); //要先记录大小在for循环那里写不行因为q里面在出数据和入数据会变
        vector<int> v;
        for(int i=0;i<levelsize;i++)
        {
            TreeNode* front = q.front();
            v.push_back(front->val);
            q.pop();
            if(front->left)
                q.push(front->left);
            if(front->right)
                q.push(front->right);
        }
        vv.push_back(v);
    }
    return vv;
    }
};



//class Solution {
//public:
//vector<vector<int>> levelOrder(TreeNode* root) {
//     //通过两个队列分别同步存储树的节点（q）和对应节点的层号（levelq），实现按层划分节点值。
//     //具体来说，先将根节点入队，同时记录其层号为 0；之后循环处理队列中的节点，每次取出队头节点和它的层号，
//     //先判断当前层在二维向量vv中是否已创建（若层号等于vv的大小，说明该层未创建，需新增一个空向量作为当前层），
//     //再将节点值存入对应层的向量中；随后将该节点的左右孩子入队，并为它们记录层号（当前节点层号 + 1），
//     //确保孩子节点属于下一层；重复此过程直到节点队列为空，最终vv中就存储了按层序排列的节点值。
//     vector<vector<int>> vv;
//     if(root==nullptr)
//         return vv;
//     queue<TreeNode*> q;
//     queue<int> levelq;
//     q.push(root);
//     int level = 0;
//     levelq.push(level);
//     while(!q.empty())
//     { 
//         TreeNode* front = q.front();
//         level = levelq.front();

//         //vv 是二维 vector，初始为空（size()=0）。
//         //当 level 为 0 时，vv[0] 尚未创建（vv 中还没有下标为 0 的子 vector），
//         //直接调用 push_back 会导致下标越界（访问未初始化的内存）。
//         //必须先判断 level 是否等于 vv.size()，如果是，说明需要新增一层，先往 vv 中插入空 vector：
//         if (level == vv.size()) 
//         {
//             vv.push_back({}); // 新增一层
//         }

//         vv[level].push_back(front->val);

//         q.pop();
//         levelq.pop();

//         if(front->left)
//         {
//             q.push(front->left);
//             levelq.push(level+1);
//         }
//         if(front->right)
//         {
//             q.push(front->right);
//             levelq.push(level+1);
//         }
//     }
//     return vv;
//     }
// };